Python์์ Requests ์ธ์ ๊ด๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ํจ์จ์ ์ธ HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ผ๋ก ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋๊ธฐ ์๊ฐ์ ์ค์ด์ธ์. ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐฐ์ฐ์ธ์.
Requests ์ธ์ ๊ด๋ฆฌ: ์ต์ ์ ์ฑ๋ฅ์ ์ํ HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ ๋ง์คํฐํ๊ธฐ
์น ๊ฐ๋ฐ ๋ฐ API ํตํฉ ์ธ๊ณ์์ ํจ์จ์ฑ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์๋ง์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ์ฐ๊ฒฐ ๊ด๋ฆฌ๋ฅผ ์ต์ ํํ๋ฉด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. Python requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์๋ต ์๊ฐ์ ๋จ์ถํ๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๋ ์ธ์
๊ด๋ฆฌ๋ผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ Requests ์ธ์
๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ์ดํด๋ณด๊ณ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์ด์ ์ ํ์ฉํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ด๋ ๋ฌด์์ ๋๊น?
HTTP Keep-Alive๋ผ๊ณ ๋ ํ๋ HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ๋จ์ผ TCP ์ฐ๊ฒฐ์ ํตํด ์ฌ๋ฌ HTTP ์์ฒญ ๋ฐ ์๋ต์ ๋ณด๋ผ ์ ์๋ ๊ธฐ์ ์ ๋๋ค. ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ด ์์ผ๋ฉด ๊ฐ ์์ฒญ์ ํธ๋์ ฐ์ดํฌ๋ฅผ ํฌํจํ๊ณ ๊ท์คํ ์๊ฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์๋นํ๋ ์๋ก์ด TCP ์ฐ๊ฒฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๋ฉด ์ฐ๊ฒฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ค์ ํ๊ณ ํด์ฒดํ๋ ์ค๋ฒํค๋๋ฅผ ํผํ ์ ์์ผ๋ฏ๋ก ํนํ ์์ ์์ฒญ์ ๋ง์ด ํ ๋ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.
API ์๋ํฌ์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ฐ์ ธ์์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ด ์์ผ๋ฉด ๊ฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋ณ๋์ ์ฐ๊ฒฐ์ด ํ์ํฉ๋๋ค. Alpha Vantage ๋๋ Open Exchange Rates์ ๊ฐ์ ๊ธ๋ก๋ฒ ๊ธ์ต API์์ ํตํ ํ์จ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์์ํด ๋ณด์ญ์์ค. ์ฌ๋ฌ ํตํ ์์ ๋ํ ํ์จ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ธ์์ผ ํ ์ ์์ต๋๋ค. ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ํตํด requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐ๊ฒฐ์ ์ ์งํ์ฌ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
Requests ์ธ์ ๊ฐ์ฒด ์๊ฐ
requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐ๊ฒฐ ํ๋ง ๋ฐ ์ฌ์ฌ์ฉ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ Session ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. Session ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด HTTP ์ฐ๊ฒฐ ํ์ ์ ์ง ๊ด๋ฆฌํ๊ณ ๋์ผํ ํธ์คํธ์ ๋ํ ํ์ ์์ฒญ์ ์ฌ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ฒฐ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ํ๋๊ณ ์์ฒญ์ด ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
Session ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import requests
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ์ธ์
์ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com')
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
# ๋์ผํ ํธ์คํธ์ ๋ค๋ฅธ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com/another_page')
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
# ์ธ์
๋ซ๊ธฐ(์ ํ ์ฌํญ์ด์ง๋ง ๊ถ์ฅ๋จ)
session.close()
์ด ์์ ์์ Session ๊ฐ์ฒด๋ https://www.example.com์ ๋ํ ๋ ์์ฒญ ๋ชจ๋์ ๋ํด ๋์ผํ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค. session.close() ๋ฉ์๋๋ ์ธ์
์ ๋ช
์์ ์ผ๋ก ๋ซ์ ๋ฆฌ์์ค๋ฅผ ํด์ ํฉ๋๋ค. ์ธ์
์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋น์ง ์์ง ์ ์์ฒด์ ์ผ๋ก ์ ๋ฆฌ๋์ง๋ง, ํนํ ์ฅ๊ธฐ ์คํ ์ ํ๋ฆฌ์ผ์ด์
๋๋ ์ ํ๋ ๋ฆฌ์์ค๊ฐ ์๋ ํ๊ฒฝ์์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ํด ์ธ์
์ ๋ช
์์ ์ผ๋ก ๋ซ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ธ์ ์ฌ์ฉ์ ์ด์
- ํฅ์๋ ์ฑ๋ฅ: ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ํนํ ๋์ผํ ํธ์คํธ์ ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์๋ต ์๊ฐ์ ํฅ์์ํต๋๋ค.
- ๊ฐ์ํ๋ ์ฝ๋:
Session๊ฐ์ฒด๋ ์ฐ๊ฒฐ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ์ฌ ์ฐ๊ฒฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. - ์ฟ ํค ์ง์์ฑ: ์ธ์ ์ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ฌ๋ฌ ์์ฒญ์์ ์ฟ ํค๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๊ธฐ๋ณธ ํค๋: ์ธ์ ๋ด์์ ์ด๋ฃจ์ด์ง ๋ชจ๋ ์์ฒญ์ ๋ํด ๊ธฐ๋ณธ ํค๋๋ฅผ ์ค์ ํ์ฌ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ฝ๋ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค.
- ์ฐ๊ฒฐ ํ๋ง: Requests๋ ๋ด๋ถ์ ์ผ๋ก ์ฐ๊ฒฐ ํ๋ง์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ๋์ฑ ์ต์ ํํฉ๋๋ค.
์ต์ ์ ์ฑ๋ฅ์ ์ํ ์ธ์ ๊ตฌ์ฑ
Session ๊ฐ์ฒด๋ ์๋ ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ์ ๊ณตํ์ง๋ง ํน์ ์๋๋ฆฌ์ค์์ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ๊ตฌ์ฑ์ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์ต์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์ด๋ํฐ
์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๋ฉด requests๊ฐ ๋ค์ํ ํ๋กํ ์ฝ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ HTTP ๋ฐ HTTPS์ ๋ํ ๋ด์ฅ ์ด๋ํฐ๊ฐ ํฌํจ๋์ด ์์ง๋ง ๋ณด๋ค ํน์ํ ์๋๋ฆฌ์ค๋ฅผ ์ํด ์ฌ์ฉ์ ์ ์ ์ด๋ํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํน์ SSL ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํน์ ์์ฒญ์ ๋ํ ํ๋ก์ ์ค์ ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ํฐ๋ ์ฐ๊ฒฐ์ด ์ค์ ๋๊ณ ๊ด๋ฆฌ๋๋ ๋ฐฉ์์ ๋ํ ๋ฎ์ ์์ค์ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ SSL ์ธ์ฆ์๋ฅผ ๊ตฌ์ฑํ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ์ฌ์๋ ์ ๋ต ๊ตฌ์ฑ
retries = Retry(total=5, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504])
# ์ฌ์๋ ๊ตฌ์ฑ์ผ๋ก ์ด๋ํฐ ์์ฑ
adapter = HTTPAdapter(max_retries=retries)
# HTTP ๋ฐ HTTPS ๋ชจ๋์ ๋ํด ์ด๋ํฐ๋ฅผ ์ธ์
์ ๋ง์ดํธ
session.mount('http://', adapter)
session.mount('https://', adapter)
# ์ธ์
์ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
try:
response = session.get('https://www.example.com')
response.raise_for_status() # ์๋ชป๋ ์๋ต(4xx ๋๋ 5xx)์ ๋ํ HTTPError ๋ฐ์
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
except requests.exceptions.RequestException as e:
print(f"์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {e}")
# ์ธ์
๋ซ๊ธฐ
session.close()
์ด ์์ ์์๋ HTTPAdapter๋ฅผ ์ฌ์ฉํ์ฌ ์คํจํ ์์ฒญ์ ์๋์ผ๋ก ์ฌ์๋ํ๋ ์ฌ์๋ ์ ๋ต์ ๊ตฌ์ฑํฉ๋๋ค. ์ด๋ ๋ถ์์ ํ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋๋ ์ผ์์ ์ธ ์ค๋จ์ ๊ฒฝํํ ์ ์๋ ์๋น์ค๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค. Retry ๊ฐ์ฒด๋ ์ต๋ ์ฌ์๋ ํ์ ๋ฐ ๋ฐฑ์คํ ํฉํฐ์ ๊ฐ์ ์ฌ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค.
2. ์ฐ๊ฒฐ ํ๋ง ์ค์ (pool_connections, pool_maxsize, max_retries)
requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐ๊ฒฐ ํ๋ง์ urllib3๋ฅผ ์ฌ์ฉํฉ๋๋ค. HTTPAdapter๋ฅผ ํตํด ํ ํฌ๊ธฐ ๋ฐ ๊ธฐํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. pool_connections ๋งค๊ฐ๋ณ์๋ ์บ์ํ ์ฐ๊ฒฐ ์๋ฅผ ์ง์ ํ๊ณ pool_maxsize ๋งค๊ฐ๋ณ์๋ ํ์ ์ ์งํ ์ต๋ ์ฐ๊ฒฐ ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ๋ฉด ์ ์ฐ๊ฒฐ์ ๋ง๋๋ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ด์ ์์์ ์ค๋ช
ํ ๋๋ก max_retries ๋งค๊ฐ๋ณ์๋ ์คํจํ ์์ฒญ์ ์ฌ์๋ํด์ผ ํ๋ ํ์๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์ด๋ ์ผ์์ ์ธ ๋คํธ์ํฌ ์ค๋ฅ ๋๋ ์๋ฒ ์ธก ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ ์ค์ํฉ๋๋ค.
์ฐ๊ฒฐ ํ๋ง ์ค์ ์ ๊ตฌ์ฑํ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import requests
from requests.adapters import HTTPAdapter
from urllib3 import PoolManager
class SourceAddressAdapter(HTTPAdapter):
def __init__(self, source_address, **kwargs):
self.source_address = source_address
super(SourceAddressAdapter, self).__init__(**kwargs)
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,maxsize=maxsize,block=block, source_address=self.source_address)
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ์ฐ๊ฒฐ ํ๋ง ์ค์ ๊ตฌ์ฑ
adapter = SourceAddressAdapter(('192.168.1.100', 0), pool_connections=20, pool_maxsize=20)
session.mount('http://', adapter)
session.mount('https://', adapter)
# ์ธ์
์ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com')
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
# ์ธ์
๋ซ๊ธฐ
session.close()
์ด ์์ ์์๋ ์ฐ๊ฒฐ ํ์ด 20๊ฐ์ ์ฐ๊ฒฐ๊ณผ ์ต๋ ํ ํฌ๊ธฐ 20์ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ ์กฐ์ ํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ง๋๋ ๋์ ์์ฒญ ์์ ์์คํ ์์ ์ฌ์ฉํ ์ ์๋ ๋ฆฌ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
3. ์ ํ ์๊ฐ ๊ตฌ์ฑ
์๋ฒ ์๋ต์ด ๋๋ฆฌ๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฌด๊ธฐํ ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ ์ ํ ์ ํ ์๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. requests ๋ฉ์๋(get, post ๋ฑ)์ timeout ๋งค๊ฐ๋ณ์๋ ์๋ฒ์์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ์ ์ง์ ํฉ๋๋ค.
์ ํ ์๊ฐ์ ์ค์ ํ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import requests
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ์ ํ ์๊ฐ์ด ์๋ ์์ฒญ ๋ง๋ค๊ธฐ
try:
response = session.get('https://www.example.com', timeout=5)
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
except requests.exceptions.Timeout as e:
print(f"์์ฒญ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค: {e}")
# ์ธ์
๋ซ๊ธฐ
session.close()
์ด ์์ ์์ ์๋ฒ๊ฐ ์๋ตํ์ง ์์ผ๋ฉด ์์ฒญ์ 5์ด ํ์ ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค. requests.exceptions.Timeout ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์๊ฐ ์ด๊ณผ ์ํฉ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฉ์ถ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
4. ๊ธฐ๋ณธ ํค๋ ์ค์
์ธ์ ์ ์ฌ์ฉํ๋ฉด ํด๋น ์ธ์ ์ ํตํด ์ด๋ฃจ์ด์ง ๋ชจ๋ ์์ฒญ์ ํฌํจ๋ ๊ธฐ๋ณธ ํค๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ธ์ฆ ํ ํฐ, API ํค ๋๋ ์ฌ์ฉ์ ์ ์ ์ฌ์ฉ์ ์์ด์ ํธ๋ฅผ ์ค์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ ํค๋๋ฅผ ์ค์ ํ๋ฉด ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋๊ณ ์ฝ๋ ์ค๋ณต์ด ์ค์ด๋ญ๋๋ค.
๊ธฐ๋ณธ ํค๋๋ฅผ ์ค์ ํ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import requests
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ๊ธฐ๋ณธ ํค๋ ์ค์
session.headers.update({
'Authorization': 'Bearer YOUR_API_KEY',
'User-Agent': 'MyCustomApp/1.0'
})
# ์ธ์
์ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com')
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
# ์ธ์
๋ซ๊ธฐ
session.close()
์ด ์์ ์์ Authorization ๋ฐ User-Agent ํค๋๋ ์ธ์
์ ํตํด ์ด๋ฃจ์ด์ง ๋ชจ๋ ์์ฒญ์ ํฌํจ๋ฉ๋๋ค. YOUR_API_KEY๋ฅผ ์ค์ API ํค๋ก ๋ฐ๊พธ์ญ์์ค.
์ธ์ ์ผ๋ก ์ฟ ํค ์ฒ๋ฆฌ
์ธ์
์ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ฌ๋ฌ ์์ฒญ์์ ์ฟ ํค๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ ์ธ์ฆ ๋๋ ์ฌ์ฉ์ ์ธ์
์ถ์ ์ ์ํด ์ฟ ํค์ ์์กดํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ํ์์ ์
๋๋ค. ์๋ฒ๊ฐ ์๋ต์ Set-Cookie ํค๋๋ฅผ ๋ณด๋ด๋ฉด ์ธ์
์ ์ฟ ํค๋ฅผ ์ ์ฅํ๊ณ ๋์ผํ ๋๋ฉ์ธ์ ๋ํ ํ์ ์์ฒญ์ ํฌํจํฉ๋๋ค.
์ธ์ ์ด ์ฟ ํค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import requests
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ์ฟ ํค๋ฅผ ์ค์ ํ๋ ์ฌ์ดํธ์ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com/login')
# ์๋ฒ์์ ์ค์ ํ ์ฟ ํค ์ธ์
print(session.cookies.get_dict())
# ๋์ผํ ์ฌ์ดํธ์ ๋ค๋ฅธ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com/profile')
# ์ฟ ํค๋ ์ด ์์ฒญ์ ์๋์ผ๋ก ํฌํจ๋ฉ๋๋ค.
print(response.status_code)
# ์ธ์
๋ซ๊ธฐ
session.close()
์ด ์์ ์์ ์ธ์
์ https://www.example.com/login์์ ์ค์ ํ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์ ์ฅํ๊ณ https://www.example.com/profile์ ๋ํ ํ์ ์์ฒญ์ ํฌํจํฉ๋๋ค.
์ธ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ฌ๋ฌ ์์ฒญ์ ์ธ์
์ฌ์ฉ: ๋์ผํ ํธ์คํธ์ ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ผ ๋๋ ํญ์
Session๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ด ๋ณด์ฅ๋๊ณ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. - ์ธ์
๋ช
์์ ์ผ๋ก ๋ซ๊ธฐ: ์ธ์
์ฌ์ฉ์ด ๋๋๋ฉด
session.close()๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ์ ๋ช ์์ ์ผ๋ก ๋ซ์ผ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌ์์ค๊ฐ ํด์ ๋๊ณ ์ฐ๊ฒฐ ๋์์ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐฉ์ง๋ฉ๋๋ค. - ํน์ ์๊ตฌ ์ฌํญ์ ๋ํ ์ด๋ํฐ ๊ตฌ์ฑ: ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ
requests๊ฐ ๋ค์ํ ํ๋กํ ์ฝ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ฌ์ฉ์ ์ ์ํ๊ณ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ์ฐ๊ฒฐ ํ๋ง ์ค์ ์ ๊ตฌ์ฑํฉ๋๋ค. - ์ ํ ์๊ฐ ์ค์ : ์๋ฒ ์๋ต์ด ๋๋ฆฌ๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฌด๊ธฐํ ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ํญ์ ์ ํ ์๊ฐ์ ์ค์ ํ์ญ์์ค.
- ์์ธ ์ฒ๋ฆฌ:
requests.exceptions.RequestException๋ฐrequests.exceptions.Timeout๊ณผ ๊ฐ์ ์์ธ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. - ์ค๋ ๋ ์์ ์ฑ ๊ณ ๋ ค:
Session๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ง๋ง ์ ์ ํ ๋๊ธฐํ ์์ด ์ฌ๋ฌ ์ค๋ ๋์์ ๋์ผํ ์ธ์ ์ ๊ณต์ ํ์ง ๋ง์ญ์์ค. ๊ฐ ์ค๋ ๋์ ๋ํด ๋ณ๋์ ์ธ์ ์ ๋ง๋ค๊ฑฐ๋ ์ค๋ ๋ ์์ ์ฐ๊ฒฐ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. - ์ฐ๊ฒฐ ํ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง: ์ฐ๊ฒฐ ํ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ์ฌ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํ ํฌ๊ธฐ๋ฅผ ์ ์ ํ๊ฒ ์กฐ์ ํฉ๋๋ค.
- ์๊ตฌ ์ธ์ ์ฌ์ฉ: ์ฅ๊ธฐ ์คํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋์คํฌ์ ์ ์ฅํ๋ ์๊ตฌ ์ธ์ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ ์์ํ ํ ์ฐ๊ฒฐ์ ๋ค์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณด์ ์ํฅ์ ์ผ๋์ ๋๊ณ ์๊ตฌ ์ธ์ ์ ์ ์ฅ๋ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ์ญ์์ค.
๊ณ ๊ธ ์ธ์ ๊ด๋ฆฌ ๊ธฐ์
1. ์ปจํ ์คํธ ๊ด๋ฆฌ์ ์ฌ์ฉ
Session ๊ฐ์ฒด๋ ์ปจํ
์คํธ ๊ด๋ฆฌ์๋ก ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก with ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ์ธ์
์ด ์๋์ผ๋ก ๋ซํ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌ์์ค ๊ด๋ฆฌ๊ฐ ๊ฐ์ํ๋๊ณ ์ธ์
๋ซ๊ธฐ๋ฅผ ์์ด๋ฒ๋ฆด ์ํ์ด ์ค์ด๋ญ๋๋ค.
import requests
# ์ธ์
์ ์ปจํ
์คํธ ๊ด๋ฆฌ์๋ก ์ฌ์ฉ
with requests.Session() as session:
# ์ธ์
์ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
response = session.get('https://www.example.com')
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
# 'with' ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ์ธ์
์ด ์๋์ผ๋ก ๋ซํ๋๋ค.
2. ๋ฐฑ์คํ๋ฅผ ์ฌ์ฉํ ์ธ์ ์ฌ์๋
์ง์ ๋ฐฑ์คํ๋ก ์ฌ์๋๋ฅผ ๊ตฌํํ์ฌ ์ผ์์ ์ธ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ๋ณด๋ค ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ์๋ ์ฌ์ด์ ์ง์ฐ์ ๋๋ ค ์คํจํ ์์ฒญ์ ์ฌ์๋ํ์ฌ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฑ๊ณต ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
# ์ธ์
๊ฐ์ฒด ์์ฑ
session = requests.Session()
# ์ฌ์๋ ์ ๋ต ๊ตฌ์ฑ
retries = Retry(total=5, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504])
# ์ฌ์๋ ๊ตฌ์ฑ์ผ๋ก ์ด๋ํฐ ์์ฑ
adapter = HTTPAdapter(max_retries=retries)
# HTTP ๋ฐ HTTPS ๋ชจ๋์ ๋ํด ์ด๋ํฐ๋ฅผ ์ธ์
์ ๋ง์ดํธ
session.mount('http://', adapter)
session.mount('https://', adapter)
# ์ธ์
์ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ธฐ
try:
response = session.get('https://www.example.com')
response.raise_for_status() # ์๋ชป๋ ์๋ต(4xx ๋๋ 5xx)์ ๋ํ HTTPError ๋ฐ์
# ์๋ต ์ฒ๋ฆฌ
print(response.status_code)
print(response.content)
except requests.exceptions.RequestException as e:
print(f"์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {e}")
# 'with' ๋ธ๋ก์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ 'with' ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ์ธ์
์ด ์๋์ผ๋ก ๋ซํ๋๋ค.
session.close()
3. ์ธ์ ๊ณผ ํจ๊ป ๋น๋๊ธฐ ์์ฒญ
๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋น๋๊ธฐ ์์ฒญ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ API์์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๊ฐ์ด I/O ๋ฐ์ธ๋ฉ๋ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. `requests` ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ๋๊ธฐ์์ด์ง๋ง `asyncio` ๋ฐ `aiohttp`์ ๊ฐ์ ๋น๋๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ์ฌ ๋น๋๊ธฐ ๋์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ธ์ ๊ณผ ํจ๊ป `aiohttp`๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ฒญ์ ๋ง๋๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import asyncio
import aiohttp
async def fetch_url(session, url):
try:
async with session.get(url) as response:
return await response.text()
except Exception as e:
print(f"{url} ๊ฐ์ ธ์ค๊ธฐ ์ค๋ฅ: {e}")
return None
async def main():
async with aiohttp.ClientSession() as session:
urls = [
'https://www.example.com',
'https://www.google.com',
'https://www.python.org'
]
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
for i, result in enumerate(results):
if result:
print(f"{urls[i]}์ ์ฝํ
์ธ : {result[:100]}...")
else:
print(f"{urls[i]}๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ์ต๋๋ค.")
if __name__ == "__main__":
asyncio.run(main())
์ธ์ ๊ด๋ฆฌ ๋ฌธ์ ํด๊ฒฐ
์ธ์ ๊ด๋ฆฌ๋ HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ๊ฐ์ํํ์ง๋ง ํน์ ์๋๋ฆฌ์ค์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฐ๊ฒฐ ์ค๋ฅ:
ConnectionError๋๋์ต๋ ์ฌ์๋ ํ์ ์ด๊ณผ์ ๊ฐ์ ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋คํธ์ํฌ ์ฐ๊ฒฐ, ๋ฐฉํ๋ฒฝ ์ค์ ๋ฐ ์๋ฒ ๊ฐ์ฉ์ฑ์ ํ์ธํ์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ ํธ์คํธ์ ์ฐ๊ฒฐํ ์ ์๋์ง ํ์ธํ์ญ์์ค. - ์ ํ ์๊ฐ ์ค๋ฅ: ์ ํ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ ํ ์๊ฐ ๊ฐ์ ๋๋ฆฌ๊ฑฐ๋ ์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ด๋๋ก ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค. ๊ธฐ๋ณธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ๋น๋๊ธฐ ์์ฒญ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ฟ ํค ๋ฌธ์ : ์ฟ ํค๊ฐ ์ง์๋์ง ์๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ก๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฟ ํค ์ค์ , ๋๋ฉ์ธ ๋ฐ ๊ฒฝ๋ก๋ฅผ ํ์ธํ์ญ์์ค. ์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฟ ํค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์: ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ ์ ๋ช ์์ ์ผ๋ก ๋ซ๊ณ ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ ํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ์ญ์์ค.
- SSL ์ธ์ฆ์ ์ค๋ฅ: SSL ์ธ์ฆ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ๋ฐ๋ฅธ SSL ์ธ์ฆ์๊ฐ ์ค์น๋๊ณ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ญ์์ค. ํ ์คํธ ๋ชฉ์ ์ผ๋ก SSL ์ธ์ฆ์ ํ์ธ์ ๋นํ์ฑํํ ์๋ ์์ง๋ง ํ๋ก๋์ ํ๊ฒฝ์์๋ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์ธ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ์ธ์ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ง๋ฆฌ์ ์์น: ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์๋ฒ ๊ฐ์ ๋ฌผ๋ฆฌ์ ๊ฑฐ๋ฆฌ๋ ๋๊ธฐ ์๊ฐ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ง๋ฆฌ์ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น์ด ์ฝํ ์ธ ๋ฅผ ์บ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋คํธ์ํฌ ์ํ: ๋์ญํญ ๋ฐ ํจํท ์์ค๊ณผ ๊ฐ์ ๋คํธ์ํฌ ์ํ๋ ์ง์ญ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด์ ํ ๋คํธ์ํฌ ์ํ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ์ญ์์ค.
- ์๊ฐ๋: ์ฟ ํค ๋ฐ ์ธ์ ๋ง๋ฃ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ์๊ฐ๋๋ฅผ ์ผ๋์ ๋์ญ์์ค. ์๊ฐ๋ ๋ณํ ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด UTC ํ์์คํฌํ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ : GDPR ๋ฐ CCPA์ ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์ธ์ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฌํ ๊ท์ ์ ์ค์ํ๋์ง ํ์ธํ์ญ์์ค. ์ฟ ํค ๋ฐ ์ธ์ ์ ์ ์ฅ๋ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ์ญ์์ค.
- ํ์งํ: ๋ค์ํ ์ธ์ด์ ๋ฌธํ๋ฅผ ์ง์ํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์งํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ฌ๊ธฐ์๋ ์ค๋ฅ ๋ฉ์์ง ๋ฒ์ญ ๋ฐ ํ์งํ๋ ์ฟ ํค ๋์ ๊ณ ์ง ์ ๊ณต์ด ํฌํจ๋ฉ๋๋ค.
๊ฒฐ๋ก
Requests ์ธ์ ๊ด๋ฆฌ๋ HTTP ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ์ต์ ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ์ธ์ ๊ฐ์ฒด, ์ด๋ํฐ, ์ฐ๊ฒฐ ํ๋ง ๋ฐ ๊ธฐํ ๊ตฌ์ฑ ์ต์ ์ ๋ณต์ก์ฑ์ ์ดํดํจ์ผ๋ก์จ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค. ์ธ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ์ ์ญ์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์ธ์ ๊ด๋ฆฌ๋ฅผ ๋ง์คํฐํ๋ฉด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ฌ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๋ requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธ์
๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋๊ธฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ด๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ต์ํํ๋ฉฐ ๊ธ๋ก๋ฒ ๋ฐฐํฌ ๋ฐ ๋ค์ํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ ํฉํ ๊ฐ๋ ฅํ๊ณ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค.